/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._415;

/**
 *
 * 给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和。
 *
 * 注意：
 *
 * num1 和num2 的长度都小于 5100.
 * num1 和num2 都只包含数字 0-9.
 * num1 和num2 都不包含任何前导零。
 * 你不能使用任何內建 BigInteger 库， 也不能直接将输入的字符串转换为整数形式。
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._415
 * @ClassName: AddStrings
 * @Author: linyaonan
 * @Date: 2019/12/27 15:37
 */
public class AddStrings {

    public String addStrings(String num1, String num2) {
        int index1 = num1.length() - 1;
        int index2 = num2.length() - 1;
        boolean oneIsMax = index1 >= index2;
        StringBuilder buffer = new StringBuilder();
        int jin = 0;
        while (index1 >=0 && index2 >= 0) {
            int w = Integer.valueOf(num1.charAt(index1) + "") + Integer.valueOf(num2.charAt(index2) + "") + jin;
            if (w > 9) {
                jin = 1;
                buffer.append(w % 10);
            } else {
                jin = 0;
                buffer.append(w);
            }
            index1--;
            index2--;
        }
        StringBuilder child = new StringBuilder();
        String z;
        index1++;
        index2++;
        if (oneIsMax) {

            if (index1 > 0) {
                z = num1.substring(0, index1);
            } else {
                z = "0";
            }
        } else {
            if (index2 > 0) {
                z = num2.substring(0, index2);
            } else {
                z = "0";
            }
        }
        z = addOne(z, jin);
        if (z != null && !"0".equals(z)) {
            child.append(z);
        }
        child.append(buffer.reverse().toString());
        return child.toString();
    }

    private String addOne(String str, int jin) {
        if (jin == 0) {
            return str;
        } else {
            StringBuilder sb = new StringBuilder();
            for (int i = str.toCharArray().length - 1; i >= 0; i--) {
                int c = Integer.valueOf(str.charAt(i) + "") + jin;
                if (c == 10) {
                    if (i == 0) {
                        sb.append("01");
                    } else {
                        sb.append('0');
                    }
                    jin = 1;
                } else {
                    sb.append(c);
                    jin = 0;
                }
            }
            return sb.reverse().toString();
        }
    }

}
